// import 'dart:async';
// import 'dart:io';
// import 'dart:typed_data';

// import 'package:dio/dio.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_sound/flutter_sound.dart';
// import 'package:flutter_spinkit/flutter_spinkit.dart';
// import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx;
// import 'package:get/get.dart' as getx;

// import 'event_bus.dart';
// import 'loading.dart';
// import 'log_util.dart';
// import 'o2_android_app_update.dart';
// import 'o2_file_path_util.dart';
// import 'o2_http_client.dart';
// import 'o2_utils.dart';

// typedef Speech2TextResult = void Function(String text);

// enum OnnxModelStatus { notInstall, installing, fail, done }

// /// 语音转文字
// /// 语音模型来自 https://github.com/k2-fsa/sherpa-onnx
// class Speech2TextHelper {

//     //私有构造函数
//   Speech2TextHelper._internal();

//   //保存单例
//   static final Speech2TextHelper _singleton = Speech2TextHelper._internal();

//   //工厂构造函数
//   factory Speech2TextHelper()=> _singleton;


//   FlutterSoundRecorder? _myRecorder;
//   StreamSubscription? _mRecordingDataSubscription;
//   bool _isInitialized = false;
//   sherpa_onnx.OnlineRecognizer? _recognizer;
//   sherpa_onnx.OnlineStream? _stream;
//   final int _sampleRate = 16000;
//   String _lastWords = '';

//   /// 初始化
//   Future<bool> init() async {
//     try {
//       final status = await OnnxModelDownloader().checkStatus();
//       if (status != OnnxModelStatus.done) {
//         OLogger.i('未安装语音转文字模型');
//         return false;
//       }
//       // 检查录音权限
//       var isPermission = await O2Utils.microphonePermission();
//       if (!isPermission) {
//         OLogger.e('没有权限，无法录音');
//         Loading.showError('im_chat_error_need_record_permission'.tr);
//         return false;
//       }
//       _myRecorder = FlutterSoundRecorder();
//       // 开启录音工具
//       await _myRecorder?.openRecorder();
//       //设置订阅计时器
//       await _myRecorder
//           ?.setSubscriptionDuration(const Duration(milliseconds: 100));
//       OLogger.i('语音转文字工具初始化完成 ');
//       return true;
//     } catch (e) {
//       OLogger.e('语音转文字工具 初始化失败 : ${e.toString()}');
//     }
//     return false;
//   }

//   Future<void> initInstance() async {
//     if (!_isInitialized) {
//       OLogger.d('------> _initInstance ${DateTime.now()}');
//       sherpa_onnx.initBindings();
//       if (_recognizer == null) {
//          _recognizer = await _createOnlineRecognizer();
//         OLogger.d('------> _createOnlineRecognizer ${DateTime.now()}');
//       }
//       _isInitialized = true;
//     }
//   }

//   /// 开始录音转化
//   Future<void> start(Speech2TextResult callback) async {
//     try {
//        _stream = _recognizer?.createStream();
//        _lastWords = '';
//       final streamController = StreamController<Uint8List>();
//       _myRecorder!.startRecorder(
//           codec: Codec.pcm16,
//           sampleRate: _sampleRate,
//           toStream: streamController.sink);
//       /// 监听录音
//       _mRecordingDataSubscription = _myRecorder?.onProgress?.listen((e) {
//         OLogger.d(' ======> subscription  ${e.toString()}');
//       });
//       OLogger.d('======> 开始录音');
//       streamController.stream.listen(
//         (data) {
//           OLogger.i('======> listen start');
//           final samplesFloat32 =
//               _convertBytesToFloat32(Uint8List.fromList(data));
//           _stream!
//               .acceptWaveform(samples: samplesFloat32, sampleRate: _sampleRate);
//           while (_recognizer!.isReady(_stream!)) {
//             _recognizer!.decode(_stream!);
//           }
//           final text = _recognizer!.getResult(_stream!).text;
//           String textToDisplay = _lastWords;
//           if (text != '') {
//             if (_lastWords == '') {
//               textToDisplay = text;
//             } else {
//               textToDisplay = '$text\n$_lastWords';
//             }
//           }
//           if (_recognizer!.isEndpoint(_stream!)) {
//             _recognizer!.reset(_stream!);
//             if (text != '') {
//               _lastWords = textToDisplay;
//             }
//           }
//           OLogger.i('======> text: $textToDisplay');
//           callback(textToDisplay);
//         },
//         onDone: () {
//           OLogger.i('======> stream stopped.');
//         },
//       );
//     } catch (e) {
//       OLogger.e('语音转文字失败', e);
//     }
//   }

//   Future<void> stop() async {
//     _stream?.free();
//     _stream = null;
//     final result = await _myRecorder?.stopRecorder();
//     OLogger.d('======>  结束录音 $result');
//     if (_mRecordingDataSubscription != null) {
//       _mRecordingDataSubscription?.cancel();
//       _mRecordingDataSubscription = null;
//     }
//   }

//   void destroy() {
//     if (_mRecordingDataSubscription != null) {
//       _mRecordingDataSubscription?.cancel();
//       _mRecordingDataSubscription = null;
//     }
//     _myRecorder?.closeRecorder();
//     _myRecorder = null;
//     _stream?.free();
//     _stream = null;
//   }

//   /// 处理模型文件
//   Future<sherpa_onnx.OnlineModelConfig> _getOnlineModelConfig() async {
//     return sherpa_onnx.OnlineModelConfig(
//       debug: false,
//       transducer: sherpa_onnx.OnlineTransducerModelConfig(
//         encoder: await O2FilePathUtil.onnxModelFilePath(
//             'encoder-epoch-99-avg-1.int8.onnx'),
//         decoder: await O2FilePathUtil.onnxModelFilePath(
//             'decoder-epoch-99-avg-1.onnx'),
//         joiner: await O2FilePathUtil.onnxModelFilePath(
//             'joiner-epoch-99-avg-1.int8.onnx'),
//       ),
//       tokens: await O2FilePathUtil.onnxModelFilePath('tokens.txt'),
//       modelType: 'zipformer',
//     );
//   }

//   /// 语音识别对象
//   Future<sherpa_onnx.OnlineRecognizer> _createOnlineRecognizer() async {
//     final modelConfig = await _getOnlineModelConfig();
//     OLogger.d('------> _getOnlineModelConfig ${DateTime.now()}');
//     final config = sherpa_onnx.OnlineRecognizerConfig(
//       model: modelConfig,
//       ruleFsts: '',
//     );
//     return sherpa_onnx.OnlineRecognizer(config);
//   }

//   Float32List _convertBytesToFloat32(Uint8List bytes,
//       [endian = Endian.little]) {
//     final values = Float32List(bytes.length ~/ 2);
//     final data = ByteData.view(bytes.buffer);
//     for (var i = 0; i < bytes.length; i += 2) {
//       int short = data.getInt16(i, endian);
//       values[i ~/ 2] = short / 32768.0;
//     }
//     return values;
//   }
// }

// /// 模型下载工具
// class OnnxModelDownloader {
//   factory OnnxModelDownloader() => _instance;

//   static final OnnxModelDownloader _instance = OnnxModelDownloader._internal();

//   OnnxModelDownloader._internal();
//   // 下载地址
//   final modelLink =
//       'https://res.o2oa.net/app/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20-mobile.zip';

//   // 当前状态
//   OnnxModelStatus status = OnnxModelStatus.notInstall;

//   /// 检查当前状态
//   Future<OnnxModelStatus> checkStatus() async {
//     if (status == OnnxModelStatus.notInstall) {
//       final results = await Future.wait([
//         'sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20-mobile.zip',
//         'encoder-epoch-99-avg-1.int8.onnx',
//         'decoder-epoch-99-avg-1.onnx',
//         'joiner-epoch-99-avg-1.int8.onnx',
//         'tokens.txt'
//       ].map((path) => _checkOnnxModelFile(path)).toList());
//       if (results.any((r) => !r)) {
//         _setStatusAndNofity(OnnxModelStatus.notInstall);
//         return OnnxModelStatus.notInstall;
//       }
//       _setStatusAndNofity(OnnxModelStatus.done);
//       return OnnxModelStatus.done;
//     }
//     return status;
//   }

//   O2AndroidAppDownloadProgressListener? _downloadListener;

//   /// 进度监听
//   void setDownloadListener(O2AndroidAppDownloadProgressListener listener) {
//     _downloadListener = listener;
//   }

//   void clearDownloadListener() {
//     _downloadListener = null;
//   }

//   /// 下载模型文件
//   Future<void> downloadModelFile() async {
//     if (status != OnnxModelStatus.notInstall) {
//       OLogger.e('已经开始....');
//       return;
//     }
//     final zipFilePath = await O2FilePathUtil.onnxModelFilePath(
//         'sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20-mobile.zip');
//     if (zipFilePath.isEmpty) {
//       OLogger.e('模型文件下载失败！！！！！');
//       return;
//     }
//     OLogger.i('==========> 开始下载模型');
//     _setStatusAndNofity(OnnxModelStatus.installing);
//     File file = File(zipFilePath);
//     if (file.existsSync()) {
//       //  删除老文件
//       file.delete();
//     }
//     // 下载进度
//     _showDownloadingDialog();
//     Response response = await O2HttpClient.instance.downloadFile(
//         modelLink, zipFilePath, onReceiveProgress: (count, total) {
//       if (_downloadListener != null) {
//         _downloadListener!(count / total);
//       }
//     });
//     clearDownloadListener();
//     if (response.statusCode != 200) {
//       OLogger.e('==========>  下载失败 ');
//       if (file.existsSync()) {
//         // 下载失败 删除文件
//         file.delete();
//       }
//       _setStatusAndNofity(OnnxModelStatus.fail);
//       return;
//     }
//     OLogger.i('==========> 下载完成 , 开始解压缩');

//     await O2FilePathUtil.unzipOnnxModel(zipFilePath);

//     _setStatusAndNofity(OnnxModelStatus.done);
//     OLogger.i('==========> 下载安装完成 ');
//   }

//   Future<bool> _checkOnnxModelFile(String fileName) async {
//     final filePath = await O2FilePathUtil.onnxModelFilePath(fileName);
//     if (filePath.isEmpty) {
//       return false;
//     }
//     final file = File(filePath);
//     if (!file.existsSync()) {
//       return false;
//     }
//     return file.lengthSync() > 0;
//   }

//   void _showDownloadingDialog() {
//     final context = getx.Get.context;
//     if (context == null) {
//       OLogger.e('没有 context  无法弹窗！');
//       return;
//     }
//     showDialog(
//         context: context,
//         barrierDismissible: false,
//         builder: (BuildContext context) {
//           return const OnnxDownloading();
//         });
//   }

//   void _setStatusAndNofity(OnnxModelStatus s) {
//     status = s;
//     EventBus().emit(EventBus.onnxStatusMsg, s);
//   }
// }

// class OnnxDownloading extends StatefulWidget {
//   const OnnxDownloading({Key? key}) : super(key: key);

//   @override
//   State<OnnxDownloading> createState() => _LoadingState();
// }

// class _LoadingState extends State<OnnxDownloading> {
//   double progress = 0.0; //

//   @override
//   void initState() {
//     OnnxModelDownloader().setDownloadListener((p) {
//       setState(() {
//         progress = p;
//       });
//       if (p >= 1.0) {
//         closeSelf();
//       }
//     });
//     super.initState();
//   }

//   @override
//   void dispose() {
//     OnnxModelDownloader().clearDownloadListener();
//     super.dispose();
//   }

//   @override
//   Widget build(BuildContext context) {
//     return AnimatedContainer(
//       duration: const Duration(milliseconds: 500),
//       curve: Curves.fastLinearToSlowEaseIn,
//       child: Dialog(
//         shape: RoundedRectangleBorder(
//           borderRadius: BorderRadius.circular(20),
//         ),
//         elevation: 0,
//         backgroundColor: Colors.transparent,
//         child: Stack(
//           children: [
//             Center(
//               child: GestureDetector(
//                 onTap: () => closeSelf(),
//                 child: Container(
//                   height: 200,
//                   width: 200,
//                   padding: const EdgeInsets.all(4),
//                   decoration: BoxDecoration(
//                     color: Colors.white,
//                     shape: BoxShape.rectangle,
//                     borderRadius: BorderRadius.circular(100),
//                     boxShadow: const [
//                       BoxShadow(
//                         color: Colors.black26,
//                         blurRadius: 10,
//                         offset: Offset(0, 10),
//                       ),
//                     ],
//                   ),
//                   child: CircularProgressIndicator(
//                     value: progress,
//                     strokeWidth: 8,
//                   ),
//                 ),
//               ),
//             ),
//             Center(
//               child: SpinKitFadingCube(
//                   color: Theme.of(context).colorScheme.primary),
//             ),
//             Center(
//                 child: Column(
//               mainAxisSize: MainAxisSize.min,
//               children: [
//                 const SizedBox(height: 240),
//                 TextButton(
//                     child: Text(
//                       'common_app_update_back_download_btn'.tr,
//                       style: const TextStyle().copyWith(color: Colors.white),
//                     ),
//                     onPressed: () => closeSelf())
//               ],
//             )),
//           ],
//         ),
//       ),
//     );
//   }

//   void closeSelf() {
//     Navigator.pop(context);
//   }
// }
